package com.etooling.framework.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 修改时间 : 2025年1月28日
 * Redis 配置类，用于定义如何序列化和反序列化存储在 Redis 中的数据。
 * 通过定义一个 RedisTemplate Bean，我们可以自定义 Redis 的序列化方式，
 * 以确保数据在存储和读取时能够正确处理。
 */
@Configuration
public class RedisConfig {

    /**
     * 定义一个 RedisTemplate Bean，用于操作 Redis 数据库。
     *
     * @param redisConnectionFactory Redis 连接工厂，用于创建连接到 Redis 实例的连接。
     * @return 配置好的 RedisTemplate 对象。
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建一个新的 RedisTemplate 实例
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        // 设置 Redis 连接工厂，用于获取 Redis 连接
        template.setConnectionFactory(redisConnectionFactory);

        // 设置 key 的序列化器为 StringRedisSerializer
        // 这样 Redis 中的键将被序列化为字符串格式
        template.setKeySerializer(new StringRedisSerializer());

        // 设置 value 的序列化器为 GenericJackson2JsonRedisSerializer
        // 这样 Redis 中的值将被序列化为 JSON 格式
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        // 设置 hash key 的序列化器为 StringRedisSerializer
        // 这样 Redis 中的哈希表的键将被序列化为字符串格式
        template.setHashKeySerializer(new StringRedisSerializer());

        // 设置 hash value 的序列化器为 GenericJackson2JsonRedisSerializer
        // 这样 Redis 中的哈希表的值将被序列化为 JSON 格式
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        // 调用 afterPropertiesSet 方法，确保所有设置都已应用
        template.afterPropertiesSet();

        // 返回配置好的 RedisTemplate 实例
        return template;
    }
}